using System;
using System.Collections.Generic;

namespace JGSY.CMS.LowCode.Platform.Application.Interfaces
{
    /// <summary>
    /// 用户上下文服务接口
    /// 提供当前用户信息的获取和管理功能
    /// </summary>
    public interface IUserContextService
    {
        /// <summary>
        /// 获取当前用户ID
        /// </summary>
        /// <returns>用户ID，如果未认证则返回null或系统默认用户ID</returns>
        long? GetCurrentUserId();

        /// <summary>
        /// 获取当前用户名
        /// </summary>
        /// <returns>用户名，如果未认证则返回"System"</returns>
        string? GetCurrentUserName();

        /// <summary>
        /// 获取当前用户邮箱
        /// </summary>
        /// <returns>用户邮箱，如果未认证或未设置则返回null</returns>
        string? GetCurrentUserEmail();

        /// <summary>
        /// 获取当前用户角色列表
        /// </summary>
        /// <returns>角色列表，如果未认证则返回["Anonymous"]</returns>
        IEnumerable<string> GetCurrentUserRoles();

        /// <summary>
        /// 检查当前用户是否有指定权限
        /// </summary>
        /// <param name="permission">权限名称</param>
        /// <returns>是否有权限</returns>
        bool HasPermission(string permission);

        /// <summary>
        /// 检查当前用户是否有指定角色
        /// </summary>
        /// <param name="role">角色名称</param>
        /// <returns>是否有该角色</returns>
        bool IsInRole(string role);

        /// <summary>
        /// 获取当前租户ID
        /// </summary>
        /// <returns>租户ID，如果未设置则返回null</returns>
        string? GetCurrentTenantId();

        /// <summary>
        /// 获取当前用户IP地址
        /// </summary>
        /// <returns>用户IP地址</returns>
        string? GetCurrentUserIpAddress();

        /// <summary>
        /// 获取当前用户User-Agent
        /// </summary>
        /// <returns>用户User-Agent字符串</returns>
        string? GetCurrentUserAgent();

        /// <summary>
        /// 检查当前用户是否为系统管理员
        /// </summary>
        /// <returns>是否为系统管理员</returns>
        bool IsSystemAdmin();

        /// <summary>
        /// 检查当前用户是否为匿名用户
        /// </summary>
        /// <returns>是否为匿名用户</returns>
        bool IsAnonymous();

        /// <summary>
        /// 获取用户Claims
        /// </summary>
        /// <returns>Claims字典</returns>
        Dictionary<string, string> GetUserClaims();
    }
}
